#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：观察者模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:17 
"""

"""
观察者模式 (Observer Pattern)
观察者模式是一种行为型设计模式，用于定义对象之间的一对多依赖关系，使得当一个对象的状态发生变化时，所有依赖它的对象都会得到通知并自动更新。

在 Python 中，观察者模式通常通过定义主题和观察者两个接口来实现。以下是一个简单的示例：

在这个示例中，Subject 是抽象主题类，定义了主题对象的接口。ConcreteSubject 是具体主题类，实现了主题对象的具体行为。

Observer 是抽象观察者类，定义了观察者对象的接口。ConcreteObserverA 和 ConcreteObserverB 是具体观察者类，实现了观察者对象的具体行为。

客户端代码创建了一个具体主题对象 subject，并将两个具体观察者对象 observer_a 和 observer_b 添加到主题对象的观察者列表中。然后通过调用主题对象的 notify 方法来通知所有观察者对象。

观察者模式适用于对象之间存在一对多的依赖关系，当一个对象的状态发生变化时需要通知其他多个对象进行相应的更新。通过使用观察者模式，可以实现对象之间的松耦合，使得系统更易于维护和扩展。
"""

from abc import ABC, abstractmethod


# 抽象主题
class Subject(ABC):
	@abstractmethod
	def attach(self, observer):
		pass

	@abstractmethod
	def detach(self, observer):
		pass

	@abstractmethod
	def notify(self):
		pass


# 具体主题
class ConcreteSubject(Subject):
	def __init__(self):
		self._observers = []

	def attach(self, observer):
		self._observers.append(observer)

	def detach(self, observer):
		self._observers.remove(observer)

	def notify(self):
		for observer in self._observers:
			observer.update()


# 抽象观察者
class Observer(ABC):
	@abstractmethod
	def update(self):
		pass


# 具体观察者A
class ConcreteObserverA(Observer):
	def update(self):
		print("具体观察者A收到更新通知")


# 具体观察者B
class ConcreteObserverB(Observer):
	def update(self):
		print("具体观察者B收到更新通知")


# 客户端代码
if __name__ == "__main__":
	subject = ConcreteSubject()

	observer_a = ConcreteObserverA()
	observer_b = ConcreteObserverB()

	subject.attach(observer_a)
	subject.attach(observer_b)

	subject.notify()
